package ejb.com.bbva.cbm.service.ejb;

import java.net.InetAddress;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import oracle.jdbc.driver.OracleTypes;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cbm.commons.Conexion;
import ejb.cbm.commons.JdbcHelper;
import ejb.com.bbva.cbm.service.AdministracionServiceLocal;
import ejb.com.bbva.cbm.service.CacheService;

@Service("cacheService")
public class CacheServiceImpl implements CacheService {
	
	static Logger logger = Logger.getLogger(CacheServiceImpl.class.getName());
	
	private static String estadoNodo = "0";
	private static String nodo = "";
	private AdministracionServiceLocal administracionServiceLocal;
	
	static {
		try {
			InetAddress inetAddress = InetAddress.getLocalHost();
			nodo = inetAddress.getHostAddress();
			logger.debug("CacheServiceImpl.bloque estatico: (Try) - Nodo " + nodo);
		} catch (Exception e) {
			nodo = "Nodo " + Math.random();
			logger.debug("CacheServiceImpl.bloque estatico (Catch): Ini - Nodo " + nodo);
		}
		String estadoVerificacion = obtenerEstadoVerificacion();
		if(estadoVerificacion != null) {
			estadoNodo = estadoVerificacion;
		}
	}

    @Autowired
    public void setAdministracionServiceLocal(AdministracionServiceLocal administracionServiceLocal) {
		this.administracionServiceLocal = administracionServiceLocal;
	}
	
	private static String obtenerEstadoVerificacion() {
		Connection cnn = null;
		CallableStatement stm = null;
		ResultSet rst = null;
		String estado = null;
		try {
			cnn = Conexion.getConnection();
			stm = cnn.prepareCall("{Call CONNEG.PQ_ADMINISTRACION.SP_VERIFICAR_CACHE(?)}");
			stm.registerOutParameter(1, OracleTypes.VARCHAR);
			stm.execute();
			estado = stm.getString(1);
			JdbcHelper.close(cnn, stm, rst);
		} catch (Exception e) {
			JdbcHelper.close(cnn, stm, rst);
			logger.error("Call CONNEG.PQ_ADMINISTRACION.SP_VERIFICAR_CACHE", e);
		}
		return estado;
	}
	
	public void registrarEstadoVerificacion() {
		logger.error("CacheServiceImpl.registrarEstadoVerificacion: Ini - Nodo " + nodo);
		Connection cnn = null;
		PreparedStatement stm = null;
		ResultSet rst = null;
		String estado = ("0".equals(estadoNodo))?"1":"0";
		try {
			cnn = Conexion.getConnection();
			stm = cnn.prepareCall("{Call CONNEG.PQ_ADMINISTRACION.SP_ACTUALIZAR_CACHE(?,?)}");
			stm.setString(1, nodo);
			stm.setString(2, estado);
			stm.execute();
			JdbcHelper.close(cnn, stm, rst);

			estadoNodo = estado;
			logger.debug("CacheServiceImpl.registrarEstadoVerificacion: estado="+estadoNodo);
		} catch (Exception e) {
			JdbcHelper.close(cnn, stm, rst);
			logger.error("Call CONNEG.PQ_ADMINISTRACION.SP_ACTUALIZAR_CACHE", e);
		}
		logger.debug("CacheServiceImpl.registrarEstadoVerificacion: Ini - Nodo " + nodo);
	}
	
	public void realizarSincronizacionCache() {
		logger.debug("CacheServiceImpl.realizarSincronizacionCache: Ini - Nodo " + nodo);
		if(administracionServiceLocal != null) {
			try {
				String estadoVerificacion = obtenerEstadoVerificacion();
				logger.debug("CacheServiceImpl.realizarSincronizacionCache: estado=" + estadoVerificacion);
				if(!estadoNodo.equals(estadoVerificacion)) {
					//Cargamos los datos de la cache
					administracionServiceLocal.inicializarCacheDatos();
					//Actualizamos el estado de la cache
					registrarEstadoVerificacion();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else {
			logger.debug("CacheServiceImpl.realizarSincronizacionCache: administracionServiceLocal=null");
		}
		logger.debug("CacheServiceImpl.realizarSincronizacionCache: Fin - Nodo " + nodo);
	}
}
